package com.leyou.trade.service.impl;

import com.leyou.common.exception.LyException;
import com.leyou.trade.entity.CartItem;
import com.leyou.trade.repository.CartRepository;
import com.leyou.trade.service.CartService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author 虎哥
 */
@Service
public class CartServiceImpl implements CartService {

    private final CartRepository repository;

    public CartServiceImpl(CartRepository repository) {
        this.repository = repository;
    }

    @Override
    public void saveCartItem(CartItem cartItem) {
        // 1.先获取之前的购物车数据
        Optional<CartItem> optional = repository.findById(cartItem.getSkuId());
        // 2.判断是否存在
        if(optional.isPresent()){
            // 2.1.存在，记录新的商品数量
            Integer num = cartItem.getNum();
            // 2.2.获取旧的数据
            cartItem = optional.get();
            // 2.3.数量累加
            cartItem.setNum(num + cartItem.getNum());
        }
        // 3.写入db
        repository.save(cartItem);
    }

    @Override
    public List<CartItem> queryCartList() {
        return repository.findAll();
    }

    @Override
    public void updateNum(Long skuId, Integer num) {
        // 查询以前的购物车数据
        Optional<CartItem> optional = repository.findById(skuId);
        // 判断是否存在
        if(!optional.isPresent()){
            // 不存在直接结束
            throw new LyException(400, "商品不存在！");
        }
        // 存在则修改
        CartItem cartItem = optional.get();
        cartItem.setNum(num);
        repository.save(cartItem);
    }

    @Override
    public void deleteCart(Long skuId) {
        repository.deleteById(skuId);
    }

    @Override
    public void addCartItemList(List<CartItem> cartItemList) {
        // 1.批量对购物车商品做判断和处理
        List<CartItem> list = cartItemList.stream()
                .map(this::saveOrUpdateCartItem).collect(Collectors.toList());
        // 2.批量写入mongoDB
        repository.saveAll(list);
    }

    private CartItem saveOrUpdateCartItem(CartItem cartItem) {
        // 1.先获取之前的购物车数据
        Optional<CartItem> optional = repository.findById(cartItem.getSkuId());
        // 2.判断是否存在
        if(optional.isPresent()){
            // 2.1.存在，记录新的商品数量
            Integer num = cartItem.getNum();
            // 2.2.获取旧的数据
            cartItem = optional.get();
            // 2.3.数量累加
            cartItem.setNum(num + cartItem.getNum());
        }
        return cartItem;
    }
}